喜歡把東西搞壞似乎是測試人員的天性,今天我們不如就練習如何把環境搞壞吧!混沌工程(Chaos Engineering)就是幫助我們提前模擬故障,驗證系統的彈性與穩定性,確保在不可避免的失敗發生時依然能穩定運行。在這篇文章中,我們將探討如何使用混沌工程工具進行效能測試與系統穩定性驗證,特別是以 Chaos Toolkit 來模擬不同故障場景,幫助我們驗證系統的穩定性與容錯能力。
目標:設計並執行一個混沌實驗,模擬應用伺服器在遭遇不同類型的資源限制情況下的行為,並收集效能數據。
描述:假設你有一個運行在 AWS 上的應用伺服器,需要測試其在遇到網路延遲、CPU 過載和記憶體耗盡的情況下的穩定性。請使用 Chaos Toolkit 來進行以下挑戰:
模擬網路延遲:設定一個混沌實驗,使用 Chaos Toolkit 在應用伺服器和資料庫之間引入 500 毫秒的網路延遲,檢查應用是否能夠正確處理超時。
CPU 過載測試:使用 Chaos Toolkit 模擬應用伺服器上的 CPU 過載情況(例如持續 60 秒的高 CPU 使用率),觀察系統是否會出現效能下降並確認負載平衡是否能將流量重新分配。
記憶體耗盡測試:模擬應用伺服器的記憶體耗盡情況,並檢查應用是否會因記憶體不足而崩潰。確保系統在記憶體釋放後能夠自動恢復。
目標成果:通過這些挑戰,你應該能夠更好地理解如何使用 Chaos Toolkit 來模擬不同的故障場景,並驗證系統的穩定性。
當我們在談到系統穩定性測試,Chaos Engineering 是一個無法忽視的領域。通過在系統內引入故障或突發狀況,Chaos Engineering 幫助團隊理解系統如何在不穩定的條件下運行。這其中,Chaos Toolkit 是一款免費開源的工具,專門用來進行這樣的實驗。
雖然網路上已經有相當多的教學資源,但簡單來說,Chaos Toolkit 讓我們能夠定義系統的穩定狀態假設(例如服務是否正常運行),接著在系統中引入變動條件(例如讓 SSL 證書過期),並觀察系統如何回應。最後,透過回復機制,我們可以讓系統回到原本的正常狀態。
Chaos Toolkit 的官方文件提供了詳細的入門指南與 Lab 範例程式碼。如果你有興趣開始學習,可以參考他們的 GitHub,以及官方教學 Getting Started with the Chaos Toolkit。
在介紹 Chaos Toolkit 時,可以搭配 stress-ng 來進行壓力測試。stress-ng 可以模擬 CPU、記憶體、I/O 等資源的高負載,讓我們透過 Chaos Toolkit 觀察系統在這些壓力下的表現。
例如,我們可以使用以下指令讓 CPU 達到 4 核心的飽和狀態 60 秒:stress-ng --cpu 4 --timeout 60s
然後使用 Chaos Toolkit 測試系統是否能在這種高負載條件下保持穩定。stress-ng 非常適合用來測試像周年慶這種高流量期間,系統是否能應對大規模使用者同時操作的情況。這種結合能幫助我們提前發現系統的極限,並進行相應的優化。
在這裡,我們需要先了解系統架構以及我們的測試目標。類似於孫悟空大鬧天庭前,必須熟悉天庭的佈局,才能夠有效率地「搞事」。
這裡介紹使用 Chaos Toolkit 來實現類似 Chaos Monkey 的功能。Chaos Toolkit 是用 Python 撰寫的混沌工程工具,可以用於模擬服務失效並驗證系統的穩定性。以下是一個簡單的範例,來模擬終止 AWS EC2 實體的操作:
{
"version": "1.0.0",
"title": "終止 EC2 實體",
"description": "模擬終止 EC2 實體的混沌實驗",
"tags": ["aws", "ec2", "chaos"],
"method": [
{
"type": "action",
"name": "terminate_ec2_instance",
"provider": {
"type": "python",
"module": "chaosaws.ec2.actions",
"func": "stop_instance",
"secrets": ["aws"],
"arguments": {
"instance_id": "i-0123456789abcdef0"
}
}
}
],
"configuration": {
"aws_region": "us-east-1",
"aws_profile_name": "default"
}
}
pip install -U chaostoolkit-aws
chaos run scripts/experiment.json
這段程式碼模擬了 EC2 實體的終止,讓我們的應用系統經歷服務失效的情境。你可以根據 ChaosToolkit 的Running Chaos Toolkit from an EC2 instance 根據需求修改實驗參數。
接下來,我們進行更細緻的測試,模擬資源限制,例如網路延遲、CPU 過載和記憶體耗盡。
模擬網路延遲
透過 Chaos Toolkit 插件 chaostoolkit-wiremock 來引入網路延遲,檢查應用的超時處理機制是否生效:
{
"method": [
{
"type": "action",
"name": "Adding a global fixed delay",
"provider": {
"type": "python",
"module": "chaoswm.actions",
"func": "global_fixed_delay",
"arguments": {
"fixedDelay": 500
}
}
}
]
}
pip install -U chaostoolkit-wiremock
chaos run experiment.json
這裡,我們引入了 500 毫秒的延遲來測試服務之間的通訊是否會受影響,並觀察應用是否能正確處理超時情況。關關於請參考 WireMock 。
CPU 過載測試
整合 stress-ng 工具模擬應用伺服器的 CPU 過載情況,檢查系統效能:
"method": [
{
"type": "action",
"name": "delete-etc-hosts-file",
"provider": {
"type": "python",
"module": "chaosansible.actions",
"func": "chaosansible_run",
"arguments": {
"host_list": ["server1","server2","server3","server4","server5"],
"num_target": "3",
"ansible": {
"module": "shell",
"args": {
"cmd": "stress-ng --cpu 0 --cpu-method matrixprod -t 60s",
}
}
}
}
}
]
chaos run -experiment.json
這個範例中,我們壓高 CPU 使用率來測試系統在過載情況下的表現,並觀察負載平衡是否能正確分流。
記憶體耗盡測試
模擬應用伺服器的記憶體耗盡情況,測試應用的穩定性:
{
"version": "1.0.0",
"title": "記憶體耗盡實驗",
"description": "模擬系統記憶體被耗盡的情況",
"steady-state-hypothesis": {
"title": "系統正常運行",
"probes": [
{
"type": "probe",
"name": "服務可用性檢查",
"tolerance": true,
"provider": {
"type": "http",
"url": "http://your-service-url/health"
}
}
]
},
"method": [
{
"type": "action",
"name": "耗盡系統記憶體",
"provider": {
"type": "process",
"path": "stress-ng",
"arguments": "--vm 1 --vm-bytes 90% -t 1m"
},
"pauses": {
"after": 65
}
}
],
"rollbacks": [
{
"type": "action",
"name": "終止記憶體壓力測試",
"provider": {
"type": "process",
"path": "pkill",
"arguments": "-f stress-ng"
}
}
]
}
chaos run -experiment.json
這個範例模擬了記憶體耗盡的情況,觀察應用是否能夠釋放資源,防止崩潰。你可以通過監控應用的記憶體使用率以及恢復後的反應時間來評估應用的恢復能力。
透過收集到的數據,我們可以分析在不同故障場景下系統的表現,並找出潛在的問題點。例如:
如果在模擬網路延遲時,系統的超時機制沒有生效,應優化超時處理邏輯。
在模擬 CPU 過載時,如果某些實例無法承受高負載而崩潰,應考慮對負載均衡機制進行調整,或增加自動擴容機制。
pip install -U chaostoolkit-system
chaos run experiment.json --journal-path journal.json
在這步驟中,我們分析從不同測試中獲得的數據,針對系統的薄弱點進行修復,從而提升系統的穩定性與容錯能力。這就像是大鬧天庭後,回過頭來檢查哪裡的防守出現了漏洞,然後加強防禦。
使用 Chaos Toolkit 進行故障模擬和資源限制測試,能幫助我們在問題發生前發現系統的弱點,並做出適當的調整,提升整體的穩定性與容錯能力。希望這篇文章能幫助你更好地理解混沌工程的價值,並應用到實際的開發和測試流程中。